申请 阿里云
的 TLS 证书时候, 会发现有 5 种选择.
- Apache
- Nginx
- IIS
- Tomcat
- Other
这五种证书, 实际上是一个东西, 但是使用的不同格式而已. 原理参考: Https 证书相关概念以及使用细节
为了验证, 我们今天做一个实验, 将这几种证书做一个转换, 首先为了方便, 我把那些下载好的证书文件重新命一个名字.
1 | . |
IIS 和 Tomcat 的证书是一样的, 只是密码不同
如何验证这一点呢, 我们使用 PFX 证书验证:
1 | # 查看 iis 证书信息 |
Nginx 和 Other 中的文件内容完全一致, Apache 和 Nginx 的证书文件不同内容相同
Nginx 和 Other
1 | diff nginx/myhost.key other/myhost.key |
可以发现二者完全相同.
Apache 和 Nginx
我们先对比 key 文件
1 | diff apache/myhost.key nginx/myhost.key |
发现 key 文件内容完全相同.
然后我们看 nginx 的 myhost.pem 文件, 里面有两部分信息组成, 内容分别为 apache/myhost.crt 和 apache/chain.crt 中的内容.
1 | // Nginx myhost.pem 文件内容 |
这说明 nginx 和 apache 只是对证书文件的内容组织形式不同, 其实内容完全一致.
nginx 证书的内容是先网站证书, 后 chain 证书.
IIS/Tomcat(PFX) 转换成 PEM 格式
1 | # 过程中需要输入 password.txt 中的密码 |
可以看到下面是生成, 生成的 pem 证书中,
1 | Bag Attributes |
与 apache, nginx, other 的证书相比, -----BEGIN CERTIFICATE-----
和 -----END CERTIFICATE-----
中间的部分部分完全相同, 顺序也是先网站证书后 chain 证书.
但是有个问题, 就是 PFX 转换完的 Key 内容与 Nginx 的 Key 内容是不一致的. 除此之外, Nginx Key 以 -----BEGIN RSA PRIVATE KEY-----
和 -----END RSA PRIVATE KEY-----
标记, 但是 PFX 转换完的 Key 以 -----BEGIN PRIVATE KEY-----
和 -----END PRIVATE KEY-----
标记. 这是为什么呢?
经过一番认证, -----BEGIN PRIVATE KEY-----
是 PKCS#8 的格式, -----BEGIN RSA PRIVATE KEY-----
是 PKCS#1 也就是标准格式.
那么就涉及这两个格式的转化问题.
1 | # pkcs#1 -> pkcs#8 可以转换成功 |
无论 pkcs#8 -> pkcs#1 是否转换成功, pkcs#1 标准格式是可以转化成 pkcs#8 的, 并且与 nginx key 对比是相同的.
参考文档:
- https://blog.csdn.net/six66hao/article/details/81814576
- https://www.cnblogs.com/cocoajin/p/10510574.html
- https://docs.open.alipay.com/58/103242
证书的使用
正如上面大致介绍的
Nginx 使用 PCKS#1(标准) Key + PEM(证书+Chain), PEM(证书+Chain) 也称为 CA Bundle.
Apache 使用 Key + 证书 + Chain 证书.
IIS 和 Tomcat 使用 PFX 证书, 是 PCKS#8 Key + 证书 + Chain 打包在一起的二进制文件, 用密码进行保护.
Other, 也是以后我们在做很多授权的时候需要用的标准格式(与 Nginx 相同), 之后的服务间授权, Gitlab, K8S, Docker Registry 等等, 都需要用到 Other 这种 Key + CA Bundle 的格式.
应用拓展
在七牛云也有证书授权服务, 其中有
- PEM 适用于 Nginx SLB
- PEM 适用于 Apache F5
- PEM 适用于 Haproxy
- JKS 适用于 Tomcat, Weblogic, JBoss
- JKS 适用于 Tomcat 8.5+
- PKCS12(即 PFX) 适用于 IIS, xchange, 代码签名
有些是我们已经讲到的, 有些没有, 你知道怎么验证他们了么?